package org.jeecg.extra.utils;

import cn.hutool.core.util.StrUtil;
import org.jeecg.common.constant.ProvinceCityArea;

import java.util.List;

/**
 * 框架地市控件工具类.
 *
 * @author chao.xie
 * @version 1.0.0
 * @创建日期: 2024.04.05
 */
public class ProvinceCityAreaUtil {
    private static final int AREA_CODE_LENGTH = 3;
    private static final String ILLEGAL_AREA_CODE_FORMAT = "areaCode格式错误, 示例: 510000,510100,510104";
    private static final ProvinceCityArea area;

    static {
        area = new ProvinceCityArea();
    }

    /**
     * 区县代码.
     *
     * <p>
     * 由于前端控件传过来的是省、市、区三级编码组合(示例: 510000,510100,510104),
     * 因此需要二次处理以便获取不同级别的区域代码. 格式如: 510104
     *
     * @param areaCode 前端组件传过来的三级编码字符串. 示例: 510000,510100,510104
     * @return 区县代码. 示例: 510104
     * @author chao.xie
     * @创建日期: 2024.04.05
     * @since 1.0.0
     */
    public static String getAreaCode(String areaCode) {
        List<String> areaCodes = StrUtil.split(areaCode, StrUtil.COMMA);
        check(areaCodes);

        return areaCodes.get(AreaIndex.AREA.ordinal());
    }

    /**
     * 市代码.
     *
     * <p>
     * 由于前端控件传过来的是省、市、区三级编码组合(示例: 510000,510100,510104),
     * 因此需要二次处理以便获取不同级别的区域代码. 格式如: 510100
     *
     * @param areaCode 前端组件传过来的三级编码字符串. 示例: 510000,510100,510104
     * @return 市代码. 示例: 510100
     * @author chao.xie
     * @创建日期: 2024.04.05
     * @since 1.0.0
     */
    public static String getCityCode(String areaCode) {
        List<String> areaCodes = StrUtil.split(areaCode, StrUtil.COMMA);
        check(areaCodes);

        return areaCodes.get(AreaIndex.CITY.ordinal());
    }

    /**
     * 市代码.
     *
     * <p>
     * 由于前端控件传过来的是省、市、区三级编码组合(示例: 510000,510100,510104),
     * 因此需要二次处理以便获取不同级别的区域代码. 格式如: 510100
     *
     * @param areaCode 前端组件传过来的三级编码字符串. 示例: 510000,510100,510104
     * @return 市代码. 示例: 510100
     * @author chao.xie
     * @创建日期: 2024.04.05
     * @since 1.0.0
     */
    public static String getProvinceCode(String areaCode) {
        List<String> areaCodes = StrUtil.split(areaCode, StrUtil.COMMA);
        check(areaCodes);

        return areaCodes.get(AreaIndex.PROVINCE.ordinal());

    }

    /**
     * 获取区县名称.
     *
     * <p>
     * 由于前端控件传过来的是省、市、区三级编码组合(示例: 510000,510100,510104),
     * 因此需要二次处理以便获取不同级别的区域名称. 格式如: 四川省/成都市
     *
     * @author chao.xie
     * @创建日期: 2024.04.05
     * @param areaCode 前端组件传过来的三级编码字符串. 示例: 510000,510100,510104
     * @return 区县名称. 示例: 四川省/成都市/锦江区
     * @since 1.0.0
     */
    public static String getAreaText(String areaCode){
        return area.getText(getAreaCode(areaCode));
    }

    /**
     * 获取市名称.
     *
     * <p>
     * 由于前端控件传过来的是省、市、区三级编码组合(示例: 510000,510100,510104),
     * 因此需要二次处理以便获取不同级别的区域名称. 格式如: 四川省/成都市
     *
     * @author chao.xie
     * @创建日期: 2024.04.05
     * @param areaCode 前端组件传过来的三级编码字符串. 示例: 510000,510100,510104
     * @return 市名称. 示例: 四川省/成都市
     * @since 1.0.0
     */
    public static String getCityText(String areaCode){
        return area.getText(getCityCode(areaCode));
    }

    /**
     * 获取省名称.
     *
     * <p>
     * 由于前端控件传过来的是省、市、区三级编码组合(示例: 510000,510100,510104),
     * 因此需要二次处理以便获取不同级别的区域名称. 格式如: 四川省
     *
     * @author chao.xie
     * @创建日期: 2024.04.05
     * @param areaCode 前端组件传过来的三级编码字符串. 示例: 510000,510100,510104
     * @return 省名称. 示例: 四川省
     * @since 1.0.0
     */
    public static String getProvinceText(String areaCode){
        return area.getText(getProvinceCode(areaCode));
    }

    /**
     * 根据区域名称获取对应的区域代码.
     *
     * <p>示例:
     * getCode("成都市/双流区"), 返回: 510116;
     *
     * @author chao.xie
     * @创建日期: 2024.04.05
     * @param text 区域名称. 如: 成都市/双流区
     * @return java.lang.String
     * @since 1.0.0
     */
    public static String getCode(String text){
        return area.getCode(text);
    }

    private static void check(List<String> areaCodes){
        if (areaCodes.size() != AREA_CODE_LENGTH) {
            throw new IllegalArgumentException(ILLEGAL_AREA_CODE_FORMAT);
        }
    }

    /**
     * 获取省、市、区县索引.
     */
    private enum AreaIndex{
        /** 省索引 */
        PROVINCE,

        /** 市索引 */
        CITY,

        /** 区索引 */
        AREA
        ;
    }
}
